// ===========   File : arry.c =============//
/*
    优点
    * 空间效率高
    * 支持随机访问
    * 缓存局限性
    * 
    缺点：
    * 插入与删除效率低
    * 长度不可变
    * 空间浪费
*/

#include <stdio.h>
#include <stdlib.h>

int arry[5] = {0};
int nums[5] = {1,2,3,4,5};

/* 随机访问元素 */
int randomAccess(int * nums,int size)
{
    // 在区间[0，size）中随机抽取一个数字
    int randomIndex = rand() % size;    /* radn() 是生成随机数，size用来限制随机数的范围*/

    // 获取并返回随机元素
    int randomNum = nums[randomIndex];
    
    printf("randomNum = %d\n",randomNum);

    return 0;
}


/* 插入元素 */
void Insert(int *nums,int size,int index,int num)
{
    //把索引index以及之后的所有的元素向后移动一位
    for(int i=size-1;i>index;i--)
    {
        nums[i] = nums[i-1];
    }

    //将元素插入到index位置
    nums[index] = num;

    //打印数组
    for (int  i = 0; i < size; i++)
    {
        printf("%d ",nums[i]);
    }
    printf("\n");
}

/* 删除元素 */
// 注意：stdio.h 占用了remove 关键字
void RemoveItem(int *nums,int size,int index)
{
    //把索引index之后的所有元素向前移动一位
    for(int i = index;i<size;i++)
    {
        nums[i] = nums[i+1];
    }

    //打印数组
    for (int  i = 0; i < size; i++)
    {
        printf("%d ",nums[i]);
    }
    printf("\n");
}

/* 查找元素 */
int find(int *nums,int size,int target)
{
    for (size_t i = 0; i < size; i++)
    {
        if (target == nums[i])
        {
            printf("找到元素的位置：%ld\n",i);
            return i;
        }
    }
    return -1;
}

/* 扩容元素 */
int *Extend(int *nums,int size,int enlarge)
{
    printf("======== 旧数组 =======");
    printf("\n");
    //打印数组
    for (int  i = 0; i < size ; i++)
    {
        printf("%d ",nums[i]);
    }
    printf("\n");


    //初始化一个扩展长度后的数组
    int *res = (int *)malloc(sizeof(int) * (size + enlarge));

    //将原数组的元素添加到新数组中
    for (int  i = 0; i < size; i++)
    {
        res[i] = nums[i];
    }

    printf("======== 扩容后的新数组 =======");
    printf("\n");
    //打印数组
    for (int  i = 0; i < size + enlarge; i++)
    {
        printf("%d ",res[i]);
    }
    printf("\n");

    //初始化扩展后的空间
    for(int i=size;i<size+enlarge;i++)
    {
        res[i] = 0;
    }

    printf("======== 初始化的新数组 =======");
    printf("\n");
    //打印数组
    for (int  i = 0; i < size + enlarge; i++)
    {
        printf("%d ",res[i]);
    }
    printf("\n");

    //返回新数组的首地址
    return res;

}

/* main函数 */
int main( int argc, char * argv[])
{
    int num = 0;
    int *ptr = NULL;
    printf("====== 随机访问 ========\n");
    num = randomAccess(nums,sizeof(nums)/sizeof(int));

    printf("====== 插入元素 ========\n");
    Insert(nums,sizeof(nums)/sizeof(int),1,10);

    printf("====== 删除元素 ========\n");
    RemoveItem(nums,sizeof(nums)/sizeof(int),2);

    printf("====== 查找元素 ========\n");
    find(nums,sizeof(nums)/sizeof(int),10);


    printf("====== 扩容元素 ========\n");
    ptr = Extend(nums,sizeof(nums)/sizeof(int),10);
    if (ptr == NULL)
    {
        printf("新数组扩容失败");
    }
    printf("新数组的首地址：%p\n",ptr);
    

}

